home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
076-100
/
scopedisk83
/
beep103
/
beep103.asm
< prev
next >
Wrap
Assembly Source File
|
1995-03-19
|
5KB
|
225 lines
******************************************************************
* *
* Beep. By David Jenkins *
* *
******************************************************************
nolist
include "exec/types.i"
include "exec/io.i"
include "exec/libraries.i"
include "exec/memory.i"
include "exec/execbase.i"
include "offsets/rom.ofs"
include "devices/audio.i"
list
sysbase equ 4
*
* Get space for variables
bra start
dc.b 'Beep 1.03'
dc.b '25/Jan/89'
start
moveq #5,d6
moveq #5,d5
cmpi.b #10,(a0) any data
beq noparm no
move.b (a0),d6 pitch
cmpi.b #10,1(a0) any data
beq noparm no
move.b 2(a0),d5 duration
noparm
movea.l 4,a6 exec base
move.l #lengthvar,d0 size of structure
move.l #MEMF_CLEAR+MEMF_PUBLIC,d1 memory type = CLEAR and PUBLIC
jsr AllocMem(a6) call AllocMem
move.l d0,a5 keep it
bne ok1
moveq #8,d0
rts
** get port space for audio device
ok1
movea.l 4,a6 exec base
moveq #MP_SIZE,d0 size of structure
move.l #MEMF_CLEAR+MEMF_PUBLIC,d1 memory type = CLEAR and PUBLIC
jsr AllocMem(a6) call AllocMem
move.l d0,audioport(a5) save Port
bne gotsp
moveq #8,d0
rts Big trouble. give up
** fill in audio port fields
gotsp movea.l audioport(a5),a1
move.b #NT_MESSAGE,LN_TYPE(a1) LN_TYPE = NT_MESSAGE(5)
move.l #audioportname,LN_NAME(a1) name
* allocate a signal bit
move.l sysbase,a6 Exec Lib Ptr
moveq.l #-1,d0 any signal will do
jsr AllocSignal(a6)
moveq.l #0,d1 convert signum to a mask
bset.l d0,d1
move.l d1,d7 stash sig bit
movea.l audioport(a5),a1
move.b d0,MP_SIGBIT(a1) save signal bit
* Find what task we are in, and install it in the msg ports
sub.l a1,a1 my task
jsr FindTask(a6)
movea.l audioport(a5),a1
move.l d0,MP_SIGTASK(a1) task pointer
** add ports
move.l audioport(a5),a1 Message Port
jsr AddPort(a6) Add another Port to list
** Set up audio IOReq structures
lea audioreq(a5),a1 audio IORequest
move.b #NT_MESSAGE,LN_TYPE(a1) LN_TYPE = NT_MESSAGE(5)
move.b #0,LN_PRI(a1) LN_PRI = 0
move.l audioport(a5),MN_REPLYPORT(a1) move in message port pointer
** open audio device
* allocate a channel
lea audioreq(a5),a1 IOReq
move.b #90,LN_PRI(a1) set priority
move.l #channel,ioa_Data(a1) ask for channel
move.l #4,ioa_Length(a1) set length to do allocate
move.w #ADCMD_ALLOCATE,IO_COMMAND(a1) get channel
lea audioname,a0 audio device name
moveq #0,d0 unit number
lea audioreq(a5),a1 IOReq
moveq #0,d1 flags
jsr OpenDevice(a6)
lea audioreq(a5),a1 IOReq
cmpi.b #0,IO_ERROR(a1) ok?
beq.s beepset yes
moveq #0,d0
move.b IO_ERROR(a1),d0
rts
* set up for beep
beepset move.l #2,d0 size of buffer
move.l #MEMF_CLEAR+MEMF_CHIP,d1 chip memory
JSR AllocMem(a6) call AllocMem
tst.l d0 got memory?
beq nomem no
movea.l d0,a4 keep memory address
move.w #$7f81,0(a4) nice square wave
redo lea audioreq(a5),a1 IOaudio
move.b #ADIOF_PERVOL,IO_FLAGS(a1) new period and volume
move.l a4,ioa_Data(a1) data
move.l #2,ioa_Length(a1) length
moveq #0,d0
moveq #0,d1
move.b d6,d0
and.b #$f,d0
bne.s 1$
move.b #5,d0
1$ move.b d0,d1
mulu #1000,d0
move.w d0,ioa_Period(a1) set period
moveq #0,d0
move.b d5,d0
and.b #$f,d0
bne.s 2$
move.b #5,d0
2$ mulu #100,d0
divu d1,d0 calculate cycles
move.w #64,ioa_Volume(a1) loud
move.w d0,ioa_Cycles(a1) how long
move.w #CMD_WRITE,IO_COMMAND(a1) write
BEGINIO
move.l d7,d0 wait for signal
jsr Wait(a6) call wait
getnext move.l audioport(a5),a0 get message form audio port
movea.l 4,a6 set Exec base
jsr GetMsg(A6) call GetMsg
tst.l d0 any more?
bne.s getnext yes
lea audioreq(a5),a1
move.b #0,IO_FLAGS(a1)
move.w #ADCMD_WAITCYCLE,IO_COMMAND(a1) wait for end
BEGINIO
move.l d7,d0 wait for signal
jsr Wait(a6) call wait
getnext2 move.l audioport(a5),a0 get message form audio port
movea.l 4,a6 set Exec base
jsr GetMsg(A6) call GetMsg
tst.l d0 any more?
bne.s getnext2 yes
lea audioreq(a5),a1
move.b IO_ERROR(a1),ret(a5)
moveq #0,d0
move.b MP_SIGBIT+audioreq(a5),d0
JSR FreeSignal(A6) FreeSignal
movea.l a4,a1 audio data
moveq #2,D0 size of structure
jsr FreeMem(A6) call FreeMem
nomem lea audioreq(a5),a1 audio IORequest
JSR CloseDevice(a6) call CloseDevice
bye movea.l audioport(a5),a1 Remove the timer Port
jsr RemPort(a6)
movea.l audioport(a5),a1 audio port
moveq #MP_SIZE,D0 size of structure
jsr FreeMem(A6) call FreeMem
moveq #0,d0
move.b ret(a5),d2
move.l a5,a1
move.l #lengthvar,D0 size of structure
jsr FreeMem(A6) call FreeMem
move.l d2,d0
rts
cnop 0,4
channel dc.l $01020408
cnop 0,4
audioname dc.b 'audio.device',0
cnop 0,4
audioportname dc.b 'Audiodj',0
offset 0
startvar
audioreq ds.b ioa_SIZEOF
audioport ds.l 1 port address
ret ds.b 1
lengthvar equ *-startvar
end